/**
 * Clasa Exp se refera la functia exponentiala.
 * O functie exponentiala este de forma f(x)=a^x.
 * Derivata acestei functii este a^x * ln(a)
 */

package q10.Functii.FunctiiElementare;
import q10.Functii.*;
import q10.Operatori.Produs;

public class Exp extends Functie {
	public static double a; /**valoarea lui a */
	public static final double E=Math.E;
	
	/**Metoda calcul() returneaza valoarea a^x calculata cu functia Calcul(double a,double x). Nu are parametrii
	 * In cazul in care valoarea lui a lipseste din arbore, rezulta o eroare.
	 * @return	double
	 * @see Calcul(double a, double x)
	 */
	public double calcul()
		{
		if (fStang==null)
			System.exit(1);
		return Calcul(fStang.calcul());
		}
	/**Metoda Calcul(double a, double x) returneaza valoarea functiei a^x.
	 * 
	 * @param a  valoarea lui a (a^x)
	 * @param x  valoarea lui x (a^x)
	 * @return double	Valoarea a^x	
	 */
	public static double Calcul(double x)
		{
		return Math.pow(E, x);
		}
	
	/** Metoda derivare() returneaza String-ul rezultat derivarii functiei exponentiale
	 * @return String
	 * */
	public String derivare()
		{
		return "e^x * ln(x)"; 
		}
	
	/**Metoda calculDerivata() calculeaza valoarea derivatei functiei exponentiale. 
	 * Foloseste metoda Calcul(double,double) mostenita din clasa Produs.
	 * In cazul in care unul dintre cei doi fii ai arborelui este null, rezulta o eroare
	 * @return double
	 */
	public double calculDerivata()
	{
	if (fStang==null)
		System.exit(1);
	return Produs.Calcul(fStang.calcul(),fStang.calculDerivata());
	}
	
	/**Metoda concatTermeni(String aux1, String aux2) concateneaza termenii functiei pentru a putea fi afisati
	 * 
	 * @param aux1  primul termen de concatenat
	 * @param aux2  al doilea termen de concatenat
	 * @return String
	 */
	public static String concatTermeni(String aux1)
		{
		String aux;
		int nrP= aux1.charAt(0) == '^' ? 0 : 2;
		aux="";
		if (nrP!=0)
			aux=aux+"e";
		aux=aux+"^";
		if (nrP!=0)
			aux=aux+aux1;
		return aux;
		}
	
	/**Metoda toString apeleaza metoda concatTermeni() si afiseaza functia
	 * @return String
	 * 
	 */
	public String toString() {
		if (fStang == null)
            System.exit(1);

        return concatTermeni(fStang.toString());
	}
}
